<?php
/* *
 * 功能：支付宝服务器异步通知页面
 * 版本：3.3
 * 日期：2012-07-23
 * 说明：
 * 以下代码只是为了方便商户测试而提供的样例代码，商户可以根据自己网站的需要，按照技术文档编写,并非一定要使用该代码。
 * 该代码仅供学习和研究支付宝接口使用，只是提供一个参考。


 *************************页面功能说明*************************
 * 创建该页面文件时，请留心该页面文件中无任何HTML代码及空格。
 * 该页面不能在本机电脑测试，请到服务器上做测试。请确保外部可以访问该页面。
 * 该页面调试工具请使用写文本函数logResult，该函数已被默认关闭，见alipay_notify_class.php中的函数verifyNotify
 * 如果没有收到该页面返回的 success 信息，支付宝会在24小时内按一定的时间策略重发通知
 */

define('IN_ECS', true);
require(dirname(__FILE__) . '/includes/init.php');
require(ROOT_PATH . 'includes/lib_order.php');
require_once(dirname(__FILE__)."/includes/modules/payment/PlayClass/alipay_notify.class.php");
//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
//合作身份者id，以2088开头的16位纯数字
$alipay_config['partner']       = '2088711694509417';

//安全检验码，以数字和字母组成的32位字符
//如果签名方式设置为“MD5”时，请设置该参数
$alipay_config['key']           = '5drlemlg93nrpi9vyjtfgp2tb5en7qcj';

//商户的私钥（后缀是.pen）文件相对路径
//如果签名方式设置为“0001”时，请设置该参数
$alipay_config['private_key_path']  = 'key/rsa_private_key.pem';

//支付宝公钥（后缀是.pen）文件相对路径
//如果签名方式设置为“0001”时，请设置该参数
$alipay_config['ali_public_key_path']= 'key/alipay_public_key.pem';


//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
//签名方式 不需修改
$alipay_config['sign_type']    = 'MD5';

//字符编码格式 目前支持 gbk 或 utf-8
$alipay_config['input_charset']= 'utf-8';

//ca证书路径地址，用于curl中ssl校验
//请保证cacert.pem文件在当前文件夹目录中
$alipay_config['cacert']    = getcwd().'\\cacert.pem';

//访问模式,根据自己的服务器是否支持ssl访问，若支持请选择https；若不支持请选择http
$alipay_config['transport']    = 'http';
//计算得出通知验证结果
$alipayNotify = new AlipayNotify($alipay_config);
$verify_result = $alipayNotify->verifyNotify();

if($verify_result) {
    //解析notify_data
    //注意：该功能PHP5环境及以上支持，需开通curl、SSL等PHP配置环境。建议本地调试时使用PHP开发软件
    $doc = new DOMDocument();   
    if ($alipay_config['sign_type'] == 'MD5') {
        $doc->loadXML($_POST['notify_data']);
    }
    
    if( ! empty($doc->getElementsByTagName( "notify" )->item(0)->nodeValue) ) {
        //商户订单号
        $out_trade_no = $doc->getElementsByTagName( "out_trade_no" )->item(0)->nodeValue;
        //商品名称
        $subject = $doc->getElementsByTagName( "subject" )->item(0)->nodeValue;
        //支付宝交易号
        $trade_no = $doc->getElementsByTagName( "trade_no" )->item(0)->nodeValue;
        //交易状态
        $trade_status = $doc->getElementsByTagName( "trade_status" )->item(0)->nodeValue;
        if (strlen($out_trade_no) > 10) {
            $log_id = str_replace($subject, '', $out_trade_no);
            $log_id = trim($log_id);
        } else {
            $log_id = trim($out_trade_no);
        }

        if($trade_status == 'TRADE_FINISHED') {
            //修改PAY_log表
            $sql = "UPDATE " .$GLOBALS['ecs']->table('pay_log').
            " SET is_paid = '1'  WHERE log_id ='$log_id' AND is_paid = 0 ";
            $db->query($sql);
            //查询订单ID
            $sql = "SELECT order_id FROM ".$GLOBALS['ecs']->table('pay_log')."WHERE log_id = $log_id ";
            $order_id = $db->getOne($sql);
            //修改订单状态
            $sql = "UPDATE " .$GLOBALS['ecs']->table('order_info').
            " SET order_status = '1' , shipping_status='0', pay_status='2',money_paid=order_amount, pay_time='" .time(). "', confirm_time='" .time(). "' WHERE order_id='$order_id' ";
            $return=$db->query($sql);
            //查询订单order_sn
            $sql = "SELECT order_sn FROM ".$GLOBALS['ecs']->table('order_info')." WHERE order_id = $order_id ";
            $order_sn = $db->getOne($sql);
            order_action($order_sn, 1, 0, 2, '买家手机支付宝支付', '买家操作');
            echo "success";     //请不要修改或删除
        }
        else if ($trade_status == 'TRADE_SUCCESS') {
            $sql = "UPDATE " .$GLOBALS['ecs']->table('pay_log').
            " SET is_paid = '1'  WHERE log_id ='$log_id' AND is_paid = 0 ";
            $db->query($sql);
            //查询订单ID
            $sql = "SELECT order_id FROM ".$GLOBALS['ecs']->table('pay_log')."WHERE log_id = $log_id ";
            $order_id = $db->getOne($sql);
            //修改订单状态
            $sql = "UPDATE " .$GLOBALS['ecs']->table('order_info').
            " SET order_status = '1' , shipping_status='0', pay_status='2',money_paid=order_amount, pay_time='" .time(). "', confirm_time='" .time(). "' WHERE order_id='$order_id' ";
            $return=$db->query($sql);
            //查询订单order_sn
            $sql = "SELECT order_sn FROM ".$GLOBALS['ecs']->table('order_info')." WHERE order_id = $order_id ";
            $order_sn = $db->getOne($sql);
            order_action($order_sn, 1, 0, 2, '买家手机支付宝支付', '买家操作');
            echo "success";     //请不要修改或删除
        }
    }

    //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
    
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
else {
    //验证失败
    echo "fail";

    //调试用，写文本函数记录程序运行情况是否正常
    //logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
}
?>